﻿using NullTodoList.Properties;
using System;
using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;

namespace NullTodoList
{
    /// <summary>
    /// Настройки всплывающего сообщения.
    /// </summary>
    [Serializable]
    public sealed class AlertSettings
    {
        /// <summary>
        /// Флаг проигрывания звукого оповещения.
        /// </summary>
        public Boolean PlaySound
        {
            get;
            set;
        }

        /// <summary>
        /// Путь к звуковому файлу.
        /// </summary>
        public String SoundFile
        {
            get;
            set;
        }
    }
    
    /// <summary>
    /// Настройки оповещения по email.
    /// </summary>
    [Serializable]
    public sealed class MailSettings
    {
        /// <summary>
        /// Хост smtp сервера
        /// </summary>
        public String SmtpHost
        {
            get;
            set;
        }

        /// <summary>
        /// Порт smtp сервера.
        /// </summary>
        public Int32 SmtpPort
        {
            get;
            set;
        }

        /// <summary>
        /// Флаг задействования SSL.
        /// </summary>
        public Boolean EnableSsl
        {
            get;
            set;
        }

        /// <summary>
        /// Адрес, с которого будут отправляться уведомления.
        /// </summary>
        public String From
        {
            get;
            set;
        }

        /// <summary>
        /// Адрес, куда будут отправляться уведомления.
        /// </summary>
        public String To
        {
            get;
            set;
        }

        /// <summary>
        /// Пароль для почтового ящика, с которого будут отправляться уведомления.
        /// </summary>
        public String Password
        {
            get;
            set;
        }
    }

    /// <summary>
    /// Настройки оповещений по sms.
    /// SMS отправляются с помощью сайта http://smsc.ru/.
    /// </summary>
    [Serializable]
    public sealed class SMSSettings
    {
        /// <summary>
        /// Номер телефона, на который будут приходит оповещения.
        /// </summary>
        public String Phone
        {
            get;
            set;
        }
        
        /// <summary>
        /// Логин в системе http://smsc.ru/.
        /// </summary>
        public String Login
        {
            get;
            set;
        }
        
        /// <summary>
        /// Пароль в системе http://smsc.ru/.
        /// </summary>
        public String Password
        {
            get;
            set;
        }

        /// <summary>
        /// Флаг транслитерации отправляемых оповещений.
        /// </summary>
        public Boolean Translit
        {
            get;
            set;
        }
    }

    /// <summary>
    /// Класс, инкапсулирующий все настройки оповещений.
    /// </summary>
    [Serializable]
    public sealed class Settings
    {
        private const String DIRECTORY_NAME = "NullToDoList";
        private const String FILE_NAME = "settings.xml";
        
        private MailSettings mailSettings;
        private SMSSettings smsSettings;
        private AlertSettings alertSettings;
        /// <summary>
        /// Конструктор по-умолчанию.
        /// </summary>
        public Settings()
        {
            mailSettings = new MailSettings();
            smsSettings = new SMSSettings();
            alertSettings = new AlertSettings();
        }

        private static String GetDefaultFileName()
        {
            return Path.Combine(Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), DIRECTORY_NAME, FILE_NAME);
        }

        /// <summary>
        /// Сохранение настроек в файл по указанному пути.
        /// </summary>
        /// <param name="path">Путь к файлу настроек.</param>
        public void SaveToFile(String path)
        {
            try
            {
                Directory.CreateDirectory(Path.GetDirectoryName(path));
                
                using (var writer = new StreamWriter(path))
                {
                    var ser = new XmlSerializer(typeof(Settings));
                    ser.Serialize(writer, this);
                }
            }
            catch (IOException)
            {
                MessageBox.Show(String.Format(Resources.MSG_ERROR_SAVE_SETTINGS, path), 
                    String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Сохранение настроек в файл по-умолчанию.
        /// </summary>
        public void SaveToFile()
        {
            SaveToFile(GetDefaultFileName()); 
        }

        /// <summary>
        /// Загрузка настроек из файла по указанному пути.
        /// </summary>
        /// <param name="path">Путь к файлу настроек.</param>
        public static Settings LoadFromFile(String path)
        {
            try
            {
                using (var reader = new StreamReader(path))
                {
                    var ser = new XmlSerializer(typeof(Settings));
                    return (Settings)ser.Deserialize(reader);
                }
            }
            catch (IOException)
            {
                return new Settings();
            }
        }

        /// <summary>
        /// Загрузка настроек из файла по-умолчанию.
        /// </summary>
        public static Settings LoadFromFile()
        {
            return LoadFromFile(GetDefaultFileName()); 
        }

        /// <summary>
        /// Настройки оповещений по email.
        /// </summary>
        public MailSettings Mail
        {
            get { return mailSettings; }
            set 
            {
                mailSettings = value;
            }
        }

        /// <summary>
        /// Настройки оповещений по sms.
        /// </summary>
        public SMSSettings SMS
        {
            get { return smsSettings; }
            set 
            {
                smsSettings = value;
            }
        }

        /// <summary>
        /// Настройки всплывающих оповещений.
        /// </summary>
        public AlertSettings Alert
        {
            get { return alertSettings; }
            set
            {
                alertSettings = value;
            }
        }
    }
}
